//
// Copyright (c) 2015, Microsoft Corporation
//
// Permission to use, copy, modify, and/or distribute this software for any
// purpose with or without fee is hereby granted, provided that the above
// copyright notice and this permission notice appear in all copies.
//
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
// IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
//

#pragma once
#include "pch.h"

typedef void (work_item_method_ptr)();
typedef std::function<work_item_method_ptr> work_item_function;
typedef std::queue<work_item_function> Queue;

#pragma warning(push)
#pragma warning(disable : 4521)
class WorkItemQueue final
{
private:
    Queue m_queue;
    CSLock m_queueLock;
    HANDLE m_availableWorkEvent;
    HANDLE m_quitEvent;
    HANDLE m_exitEvent;
    DWORD m_threadId;

private:
    WorkItemQueue(WorkItemQueue&) = delete;
    WorkItemQueue(WorkItemQueue const &) = delete;

public:
    WorkItemQueue();
    ~WorkItemQueue();
    void Start();
    void PostWorkItem(work_item_function workItem);
    void PostQuit();
    void WaitForQuit();
};
#pragma warning(pop)
